package com.thz.common.exception;

import com.thz.common.enums.ErrorCode;
import lombok.Getter;

/**
 * 业务异常类
 * 
 * @author THZ
 * @date 2025
 */
@Getter
public class BusinessException extends RuntimeException {
    
    private static final long serialVersionUID = 1L;
    
    /**
     * 错误码
     */
    private Integer code;
    
    /**
     * 使用错误码枚举构造异常
     * 
     * @param errorCode 错误码枚举
     */
    public BusinessException(ErrorCode errorCode) {
        super(errorCode.getMessage());
        this.code = errorCode.getCode();
    }
    
    /**
     * 使用错误码枚举构造异常（带额外信息）
     * 
     * @param errorCode 错误码枚举
     * @param extraMessage 额外的错误信息
     */
    public BusinessException(ErrorCode errorCode, String extraMessage) {
        super(errorCode.getMessage() + "：" + extraMessage);
        this.code = errorCode.getCode();
    }
    
    /**
     * 使用错误码枚举构造异常（带原因）
     * 
     * @param errorCode 错误码枚举
     * @param cause 异常原因
     */
    public BusinessException(ErrorCode errorCode, Throwable cause) {
        super(errorCode.getMessage(), cause);
        this.code = errorCode.getCode();
    }
    
    /**
     * 使用错误码枚举构造异常（带额外信息和原因）
     * 
     * @param errorCode 错误码枚举
     * @param extraMessage 额外的错误信息
     * @param cause 异常原因
     */
    public BusinessException(ErrorCode errorCode, String extraMessage, Throwable cause) {
        super(errorCode.getMessage() + "：" + extraMessage, cause);
        this.code = errorCode.getCode();
    }
    
    // ==================== 保留旧的构造方法以兼容 ====================
    
    public BusinessException(String message) {
        super(message);
        this.code = 500;
    }
    
    public BusinessException(Integer code, String message) {
        super(message);
        this.code = code;
    }
    
    public BusinessException(String message, Throwable cause) {
        super(message, cause);
        this.code = 500;
    }
}




